home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Skunkware 5
/
Skunkware 5.iso
/
src
/
X11
/
wais
/
x
/
xwaisq.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-09
|
14KB
|
480 lines
/* WIDE AREA INFORMATION SERVER SOFTWARE:
No guarantees or restrictions. See the readme file for the full standard
disclaimer.
This is part of the X user-interface for the WAIS software. Do with it
as you please.
jonathan@Think.COM
*
* $Log: xwaisq.c,v $
* Revision 1.20 92/04/28 15:34:58 jonathan
* Cleaned up includes. Replaced references to directory routines with
* scandir.
*
* Revision 1.19 92/03/23 16:11:30 jonathan
* Added stuff to set button sensitivity.
*
* Revision 1.18 92/03/17 15:08:23 jonathan
* Typed ExitCommand.
*
* Revision 1.17 92/03/17 14:22:32 jonathan
* Generally cleaned up.
*
* Revision 1.16 92/03/07 19:39:23 jonathan
* Fixed argument to ScanDirs.
*
* Revision 1.15 92/03/06 15:01:51 jonathan
* Moved freopen to right before main loop.
*
* Revision 1.14 92/03/06 14:49:19 jonathan
* New and Improved source loading! Also rescans source directory if it
* changes.
*
* Revision 1.13 92/03/01 14:04:06 jonathan
* Added command_name to main.
*
*/
#ifndef lint
static char *RCSid = "$Header: /tmp_mnt/net/quake/proj/wais/wais-8-b5/x/RCS/xwaisq.c,v 1.20 92/04/28 15:34:58 jonathan Exp $";
#endif
#define XWAISQ_C
#define MAIN
#include "xwais.h"
#define offset(field) XtOffset(struct _app_resources*, field)
static XtResource resources[] = {
{"questionDirectory", "QuestionDirectory", XtRString, sizeof(char *),
offset(questionDirectory), XtRString, "~/wais-questions/"},
{"userSourceDirectory", "UserSourceDirectory", XtRString, sizeof(char *),
offset(userSourceDirectory), XtRString, "~/wais-sources/"},
{"commonSourceDirectory", "CommonSourceDirectory", XtRString, sizeof(char *),
offset(commonSourceDirectory), XtRString, ""},
{"documentDirectory", "DocumentDirectory", XtRString, sizeof(char *),
offset(documentDirectory), XtRString, "~/wais-documents/"},
{"helpFile", "HelpFile", XtRString, sizeof(char *),
offset(helpFile), XtRString, "./XwaisHELP"},
{"removeSeekerCodes", "RemoveSeekerCodes", XtRString, sizeof(char *),
offset(removeSeekerCodes), XtRString, "On"},
{"rescanInterval", "RescanInterval", XtRString, sizeof(char *),
offset(rescanInterval), XtRString, "1"},
{"seedWords", "SeedWords", XtRString, sizeof(char *),
offset(seedWords), XtRString, ""},
{"initialSource", "InitialSource", XtRString, sizeof(char *),
offset(initialSource), XtRString, ""},
{"questionName", "QuestionName", XtRString, sizeof(char *),
offset(questionName), XtRString, ""},
{"filters", "Filters", XtRString, sizeof(char *),
offset(filters), XtRString, ""},
{"maximumResults", "MaximumResults", XtRInt, sizeof(int),
offset(maximumResults), XtRImmediate, (caddr_t) 40},
{"doSearch", "DoSearch", XtRBoolean, sizeof(Boolean),
offset(doSearch), XtRBoolean, False},
{"defaultsInstalled", "DefaultsInstalled", XtRBoolean, sizeof(Boolean),
offset(defaultsInstalled), XtRBoolean, False},
{"showKeys", "ShowKeys", XtRBoolean, sizeof(Boolean),
offset(showKeys), XtRBoolean, False}
};
#undef offset
XtActionsRec xwaisActionsTable[] = {
/* special for return only */
{(String)"waissearch", (XtActionProc)DoSearch},
{(String)"save", (XtActionProc)DoSave},
{(String)"quit", (XtActionProc)DontSave},
{(String)"tsave", (XtActionProc)DoTSave},
{(String)"setdir", (XtActionProc)SetDir},
NULL
};
void ExitCommand()
{
exit(-1);
}
PopExit(parent, message)
Widget parent;
char *message;
{
Widget shell, frame, labelwid, stringlabelwid;
WidgetClass wclass;
static String namestring;
Arg args[5];
Position x, y;
Dimension width, height;
Cardinal n;
shell = XtCreatePopupShell("exitpopup", applicationShellWidgetClass,
parent, NULL, ZERO);
frame = XtCreateManagedWidget("exitpopupform", formWidgetClass,
shell, NULL, ZERO);
labelwid = MakeLabel(frame, "exitlabel", message, NULL, NULL);
MakeCommandButton(frame, "Ok", ExitCommand, labelwid, NULL, NULL);
n = 0;
XtSetArg(args[n], XtNx, 100); n++;
XtSetArg(args[n], XtNy, 100); n++;
XtSetArg(args[n], XtNtitle, "XWAIS Question Error"); n++;
XtSetValues(shell, args, n);
XtPopup(shell, XtGrabExclusive);
}
static time_t usersourcetime, commonsourcetime, questiontime;
static int rescanint;
void ScanDirs(closure, id)
Opaque closure;
XtIntervalId *id;
{
char **list_data;
float top, shown;
int CurrentQuestion, CurrentSource, i;
struct stat buf;
boolean rescan;
char string[STRINGSIZE];
rescan = FALSE;
stat(app_resources.userSourceDirectory, &buf);
if(buf.st_mtime != usersourcetime) {
usersourcetime = buf.st_mtime;
rescan = TRUE;
}
if(app_resources.commonSourceDirectory[0] != 0) {
stat(app_resources.commonSourceDirectory, &buf);
if(buf.st_mtime != commonsourcetime) {
commonsourcetime = buf.st_mtime;
rescan = TRUE;
}
}
if (rescan) {
rescan = FALSE;
CurrentSource = get_selected_source();
if (CurrentSource != NO_ITEM_SELECTED)
strcpy(string, Source_items[CurrentSource]);
NumSources = 0;
GetSourceNames(app_resources.userSourceDirectory);
if(app_resources.commonSourceDirectory[0] != 0)
GetSourceNames(app_resources.commonSourceDirectory);
RebuildListWidget(sourcewindow, Source_items);
if(CurrentSource != NO_ITEM_SELECTED) {
for(i = 0;
Source_items[i] != NULL &&
strcmp(Source_items[i], string) != 0;
i++);
if(i < NumSources) XawListHighlight(sourcewindow->ListWidget, i);
}
}
rescantimerid = XtAddTimeOut(rescanint, ScanDirs, (Opaque) ScanDirs);
}
/* this will take as its argument the name of a question file,
and will do all the right things with it.
*/
char *log_file_name = NULL;
FILE *logfile = NULL;
void
main(argc, argv)
int argc;
char *argv[];
{
struct stat buf;
long count;
Widget frame, labelwid, stringlabelwid, button;
WidgetClass wclass;
static String
name = "";
Arg arglist[10];
Cardinal num_args;
static String items[] = {NULL};
int n;
float shown;
Question question;
char msg[STRINGSIZE];
Type_items = (char**)s_malloc(20*sizeof(char*));
Type_items[0] = NULL;
if (command_name = (char*)rindex(argv[0], '/'))
command_name++;
else
command_name = argv[0];
the_Source = (Source) s_malloc(sizeof(_Source));
NumSources = 0;
allText = NULL;
double_click = FALSE;
top = XtInitialize("xwais", "Xwais", NULL, 0, &argc, argv);
XtAddActions(xwaisActionsTable, XtNumber(xwaisActionsTable));
XtGetApplicationResources(top, &app_resources, resources,
XtNumber(resources), NULL, 0);
app_context = XtWidgetToApplicationContext(top);
if (app_resources.defaultsInstalled == False) {
PopExit(top, "X resources not properly installed");
XtMainLoop();
}
if(app_resources.documentDirectory[0] == '~') {
char *home, *dir, *getenv();
if((home = getenv("HOME")) != NULL) {
if((dir = s_malloc(strlen(home) +
strlen(app_resources.documentDirectory) +
2)) == NULL) {
fprintf(stderr, "Ran out of space trying to create directory name.\n");
exit(-1);
}
strcpy(dir, home);
strcat(dir, &app_resources.documentDirectory[1]);
app_resources.documentDirectory=dir;
}
}
if(app_resources.userSourceDirectory[0] == '~') {
char *home, *dir, *getenv();
if((home = getenv("HOME")) != NULL) {
if((dir = s_malloc(strlen(home) +
strlen(app_resources.userSourceDirectory) +
2)) == NULL) {
fprintf(stderr, "Ran out of space trying to create directory name.\n");
exit(-1);
}
strcpy(dir, home);
strcat(dir, &app_resources.userSourceDirectory[1]);
app_resources.userSourceDirectory=dir;
}
}
sdir = app_resources.userSourceDirectory;
cdir = app_resources.commonSourceDirectory;
stat(app_resources.userSourceDirectory, &buf);
usersourcetime = buf.st_mtime;
GetSourceNames(app_resources.userSourceDirectory);
if(app_resources.commonSourceDirectory[0] != 0) {
stat(app_resources.commonSourceDirectory, &buf);
commonsourcetime = buf.st_mtime;
GetSourceNames(app_resources.commonSourceDirectory);
}
if(app_resources.questionDirectory[0] == '~') {
char *home, *dir, *getenv();
if((home = getenv("HOME")) != NULL) {
if((dir = s_malloc(strlen(home) +
strlen(app_resources.questionDirectory) +
2)) == NULL) {
fprintf(stderr, "Ran out of space trying to create directory name.\n");
exit(-1);
}
strcpy(dir, home);
strcat(dir, &app_resources.questionDirectory[1]);
app_resources.questionDirectory=dir;
}
}
/* let's see if it exists, if not, try to create it */
{
DIR *dirp;
char *makedir;
if((dirp = opendir(app_resources.questionDirectory)) == NULL) {
if((makedir = s_malloc(strlen(app_resources.questionDirectory) + 12))
== NULL) {
fprintf(stderr, "Ran out of space trying to create directory name.\n");
exit(-1);
}
strcpy(makedir, "/bin/mkdir ");
strcat(makedir, app_resources.questionDirectory);
if(makedir[strlen(makedir)-1] == '/') makedir[strlen(makedir)-1] = 0;
if(system(makedir) != 0)
fprintf(stderr, "Error creating directory: %s\n",
app_resources.questionDirectory);
}
else
closedir(dirp);
if((dirp = opendir(app_resources.userSourceDirectory)) == NULL) {
if((makedir = s_malloc(strlen(app_resources.userSourceDirectory) + 12))
== NULL) {
fprintf(stderr, "Ran out of space trying to create directory name.\n");
exit(-1);
}
strcpy(makedir, "/bin/mkdir ");
strcat(makedir, app_resources.userSourceDirectory);
if(makedir[strlen(makedir)-1] == '/') makedir[strlen(makedir)-1] = 0;
if(system(makedir) != 0)
fprintf(stderr, "Error creating directory: %s\n",
app_resources.userSourceDirectory);
}
else
closedir(dirp);
if((dirp = opendir(app_resources.documentDirectory)) == NULL) {
if((makedir = s_malloc(strlen(app_resources.documentDirectory) + 12))
== NULL) {
fprintf(stderr, "Ran out of space trying to create directory name.\n");
exit(-1);
}
strcpy(makedir, "/bin/mkdir ");
strcat(makedir, app_resources.documentDirectory);
if(makedir[strlen(makedir)-1] == '/') makedir[strlen(makedir)-1] = 0;
if(system(makedir) != 0)
fprintf(stderr, "Error creating directory: %s\n",
app_resources.documentDirectory);
}
else
closedir(dirp);
}
{
char qfilename[256];
FILE *fp;
if (argc == 1) /* we have no quesiton specified. Let's just make a new one */
{
the_Question = (XQuestion)s_malloc(sizeof(_XQuestion));
the_Question->q = (Question)s_malloc(sizeof(_Question));
if(app_resources.questionName[0] != 0)
strcpy(the_Question->q->name, app_resources.questionName);
else
strcpy(the_Question->q->name, "New Question");
}
else if (argc == 2)
{
sprintf(qfilename, "%s%s", app_resources.questionDirectory, argv[1]);
if((fp = fopen(qfilename, "r")) == NULL) {
fprintf(stderr, "Can't open question %s\n", qfilename);
exit(-1);
}
the_Question = (XQuestion)s_malloc(sizeof(_XQuestion));
the_Question->q = (Question)s_malloc(sizeof(_Question));
strcpy(the_Question->q->name, argv[1]);
ReadQuestion(the_Question->q, fp);
fclose(fp);
}
else
{
fprintf(stderr, "usage: %s [Question_file_name]", argv[0]);
exit(0);
}
}
if (app_resources.seedWords[0] != 0
&& the_Question->q->keywords[0] == 0)
strcpy(the_Question->q->keywords, app_resources.seedWords);
if (app_resources.initialSource[0] != 0
&& the_Question->q->Sources == NULL) {
the_Question->q->Sources = makeSourceList((SourceID)s_malloc(sizeof(_SourceID)),
NULL);
the_Question->q->Sources->thisSource->filename = s_strdup(app_resources.initialSource);
}
maxDocs = app_resources.maximumResults;
CurDpy = XtDisplay(top);
MakeQuestionForm(the_Question);
sourcepopup = (Widget) MakeSourcePopup(top);
messwidget = the_Question->window->StatusWindow;
GetSourceNames(app_resources.userSourceDirectory);
if(app_resources.commonSourceDirectory[0] != 0)
GetSourceNames(app_resources.commonSourceDirectory);
/* and away we go! */
question = the_Question->q;
sprintf(msg, "X WAIS Question: %s", question->name);
num_args = 0;
XtSetArg(arglist[num_args], XtNtitle, msg); num_args++;
XtSetArg(arglist[num_args], XtNiconName, question->name); num_args++;
XtSetValues(top, arglist, num_args);
question->modified = TRUE;
sourcewindow = (ScrollList)MakeSourceFrame(top);
typewindow = (ScrollList)MakeTypeFrame(top);
XtRealizeWidget(top);
/* do all the necessary stuff */
the_Question->Source_Items =
buildSourceItemList(question->Sources);
RebuildListWidget(the_Question->window->Sources, the_Question->Source_Items);
RebuildListWidget(sourcewindow, Source_items);
question->numsources = charlistlength(the_Question->Source_Items);
the_Question->Relevant_Items =
buildDocumentItemList(question->RelevantDocuments, FALSE);
RebuildListWidget(the_Question->window->RelevantDocuments,
the_Question->Relevant_Items);
question->numdocs = charlistlength(the_Question->Relevant_Items);
the_Question->Result_Items =
buildDocumentItemList(question->ResultDocuments, TRUE);
RebuildListWidget(the_Question->window->ResultDocuments,
the_Question->Result_Items);
question->numresdocs = charlistlength(the_Question->Result_Items);
if(app_resources.doSearch != False) DoSearch(NULL, NULL, NULL);
rescanint = 1000 * atoi(app_resources.rescanInterval);
rescantimerid = XtAddTimeOut(rescanint, ScanDirs, (Opaque) ScanDirs);
/*freopen("/dev/null", "a", stderr);*/
MakeWaisCursors();
unfuzzButtons();
XtSetArg(arglist[0], XtNsensitive, False);
XtSetValues(viewbutton, arglist, ONE);
XtSetValues(saveAsButton, arglist, ONE);
XtMainLoop();
}